這次實作主要為使用 Notification
由系統發出通知,向使用者顯示通知訊息。
從 API 26 開始,Android 多了通知頻道(Notification channels)的功能,並且一定要實作通知頻道,
而 API 26 以前的版本將會顯示舊的通知效果,不會有通知頻道的效果。
左圖為應用程式通知的設定,可看到多個頻道,右圖為單一頻道點選進去後可為該頻道做的設定。
NotificationChannel (id: String, name: CharSequence, importance: Int)
val channel = NotificationChannel("Day15", "Day15", NotificationManager.IMPORTANCE_HIGH)
id:建立的頻道的識別 id,一個 package 裡面不能有多個頻道擁有相同 id,id 若設置太長可能會被截斷。
name:使用者會看到的頻道名稱,建議名稱的最大長度為 40 個字符,若太常可能會被截斷。
importance:設置 APP 安裝時預設的此頻道通知重要性,使用者安裝後可在設定中作變更,會影響通知的表現方式,可為下列其中一種:
IMPORTANCE_UNSPECIFIED:無特定設定重要性,保留偏好設定,不應與實際通知相關聯。
上面敘述為照官方文件翻譯,但其實看不太懂是什麼意思QQ
IMPORTANCE_NONE:不重要,沒有任何提醒效果(彈出提醒、音效及震動),也不會在任何地方顯示通知。
IMPORTANCE_MIN:重要性為最低,沒有任何提醒效果(彈出提醒、音效及震動),不顯示在狀態欄,僅顯示在展開的通知欄中。
IMPORTANCE_LOW:重要性低,沒有任何提醒效果(彈出提醒、音效及震動),顯示在狀態欄及展開的通知欄中。
IMPORTANCE_DEFAULT:預設的重要性,不會彈出提醒,可以發出音效及震動,顯示在狀態欄及展開的通知欄中。
IMPORTANCE_HIGH:重要性高,會彈出提醒,可以發出音效及震動,顯示在狀態欄及展開的通知欄中,可以使用全螢幕的 intent(例如手機來電時布滿螢幕的來電顯示及可選擇是否接聽的畫面)。
這裡建立好的 NotificationChannel 要被提交註冊至 NotificationManager 才能被使用。
通知的類別,可以設置通知顯示的樣貌
透過 Notification.Builder 建立 Notification
建立 Notification.Builder
Notification.Builder (context: Context, channelId: String )
val builder = Notification.Builder(this, "Day15")
context:用來建構通知欄 RemoteView 的 Context。
channelId:建立的通知所屬的通知頻道 id,只能使用已被提交註冊到 NotificationManager 中的通知頻道。
Notification.Builder (context: Context)
此方法在 API 26 以上已被棄用
用 Notification.Builder 中的方法設置 Notification 的樣式
設置通知的小圖示,為一定要設置的項目。
setSmallIcon (icon: Int)
設置通知的大圖示。
setLargeIcon (b: Bitmap)
設置通知的標題。
setContentTitle (title: CharSequence)
設置通知的內容文字
setContentText (text: CharSequence)
設置使用者點擊通知時要觸發的 intent 行為
setContentIntent(intent: PendingIntent)
讓通知在使用者點擊通知時自動移除
setAutoCancel (autoCancel: Boolean)
builder.setSmallIcon(R.drawable.ic_directions_walk_black_24dp)
.setContentTitle("Day15")
.setContentText("Day15 Challenge")
.setLargeIcon(BitmapFactory.decodeResource(resources,R.mipmap.ic_launcher_test))
.setAutoCancel(true)
用 Notification.Builder 中的方法建立 Notification
build () : Notification
val notification : Notification = builder.build()
負責管理及發送通知的類別。
取得 NotificationManager
透過 Context 的 getSystemService 方法取得 NotificationManager 類別的實例
getSystemService (name: String)
val manager = getSystemServiceNOTIFICATION_SERVICE) as NotificationManager
在 NotificationManager 中提交註冊前面建立好的通知頻道
createNotificationChannel (channel: NotificationChannel)
manager.createNotificationChannel(channel)
notify 方法
發出通知
notify (id: Int, notification: Notification)
manager.notify(0, notification)
id:發送的通知的識別 id,在同一個 App 中每個通知的 id 都應該要是唯一的。
若新通知與舊通知的 id 一樣,則新通知會覆蓋掉舊通知。
notification:前面建好的要發送給使用者的通知。
notify (tag: String, id: Int, notification: Notification)
tag:發送的通知的識別字串,可以為 null(等同於上一個方法)。
id:發送的通知的識別 id,在同一個 App 中每個通知的 id 都應該要是唯一的。
notification:前面建好的要發送給使用者的通知。
Android
Kotlin
Notification